//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-06-24     ZhangYihua   first version
//
// Description  : 
//################################################################################

module ccnt_wc_reg #(
parameter           IW                      = 1,
parameter           DW                      = 32,
parameter           CW                      = 16
) ( 
input                                       rst_n,
input                                       clk,

input                                       cs,
input                                       re,
input                                       we,
input                                       wd,

input                                       ce,
input               [IW-1:0]                inc,
output              [CW-1:0]                q
);

//################################################################################
// define local varialbe and localparam
//################################################################################
wire                                        wr_hit;
wire                                        rd_hit;
reg                 [CW-1:0]                cnt;

//################################################################################
// main
//################################################################################

assign wr_hit = cs & we & wd;
assign rd_hit = cs & re;
always@(posedge clk or negedge rst_n) begin
    if (rst_n==1'b0) begin
        cnt <=`U_DLY {CW{1'b0}};
    end else begin
        if (wr_hit==1'b1)
            cnt <=`U_DLY {CW{1'b0}};
        else if (ce==1'b1)
            cnt <=`U_DLY cnt + inc;
        else
            ;
    end
end

generate if (CW>DW) begin:G_MA
    localparam          HW                      = CW-DW;
    reg                 [HW-1:0]                cnt_h;

    always@(posedge clk or negedge rst_n) begin
        if (rst_n==1'b0) begin
            cnt_h <=`U_DLY {HW{1'b0}};
        end else begin
            if (rd_hit==1'b1)
                cnt_h <=`U_DLY cnt[DW+:HW];
            else
                ;
        end
    end
    assign q = {cnt_h, cnt[0+:DW]};

end else begin:G_SA

    assign q = cnt;

end endgenerate

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
